widget: Add brute force method to propagate clip
authorBenjamin Otte <otte@redhat.com>
Wed, 2 Mar 2016 23:35:15 +0000 (00:35 +0100)
committerBenjamin Otte <otte@redhat.com>
Wed, 2 Mar 2016 23:43:59 +0000 (00:43 +0100)
When a gtk_widget_queue_allocate() on some widget increases the clip,
widget->parent's clip was not updated. This appraoch naively just
unions widget's new clip with widget->parent's clip.

This of course only works if widget and parent share the same GDK
window. In the cases where they don't we can't do anything and need a
better fix.

Fixes label-text-shadow-changes-modify-clip.ui reftest.

gtk/gtkwidget.c

index 604f1487e20ddfb786ffd2d9000c8b547e9f6c96..508c0ebadd8f89d7b8f859d991913eb3d10aadfb 100644 (file)
@@ -15520,6 +15520,23 @@ gtk_widget_set_clip (GtkWidget           *widget,
 #endif /* G_ENABLE_DEBUG */
 
   priv->clip = *clip;
+
+  while (priv->parent &&
+         _gtk_widget_get_window (widget) == _gtk_widget_get_window (priv->parent))
+    {
+      GtkWidgetPrivate *parent_priv = priv->parent->priv;
+      GdkRectangle union_rect;
+
+      gdk_rectangle_union (&priv->clip,
+                           &parent_priv->clip,
+                           &union_rect);
+
+      if (gdk_rectangle_equal (&parent_priv->clip, &union_rect))
+        break;
+
+      parent_priv->clip = union_rect;
+      priv = parent_priv;
+    }
 }
 
 /*